Skip to content

Add Jablotron LF tag support (read, emulate, write to T55xx) - #917

Draft
midlan wants to merge 2 commits into
GameTec-live:mainfrom
midlan:jablotron-support
Draft

Add Jablotron LF tag support (read, emulate, write to T55xx)#917
midlan wants to merge 2 commits into
GameTec-live:mainfrom
midlan:jablotron-support

Conversation

@midlan

@midlan midlan commented Jul 8, 2026

Copy link
Copy Markdown

Summary

Adds support for the Jablotron LF tag, threaded through the GUI the same way the
other LF tags (EM410X, Viking, PAC, HID Prox, ioProx, IDTECK) are. Jablotron is a
5-byte (40-bit) tag; its ID is shown both as hex and as the decimal card number
(BCD-derived), matching the Python CLI output.

What's included

  • TagType.jablotron (180) and commands JABLOTRON_SCAN (3019),
    JABLOTRON_WRITE_TO_T55XX (3020), JABLOTRON_SET_EMU_ID (5010),
    JABLOTRON_GET_EMU_ID (5011).
  • JablotronCard whose viewable string shows the decimal card number alongside the
    hex ID.
  • Read a Jablotron tag (added to the LF scan chain on the Read Card page).
  • Emulate: set/get the Jablotron emulator ID on a slot (slot grid write, slot Edit
    dialog, and export).
  • Write a Jablotron ID to a T55xx tag, with read-back verification.
  • Unit test covering the BCD card-number conversion, the viewable string, and a byte
    round-trip.

Firmware dependency

Requires ChameleonUltra firmware with Jablotron support (the device-side commands).
That support is currently in the firmware's main branch (reachable via the app's
bleeding-edge firmware update) but is not yet in a tagged firmware release. On
firmware without Jablotron support the actions degrade gracefully — a scan returns
empty and the LF read chain moves on.

Capability gate — intentionally left unchanged

home.dart's areCapabilitiesSupported() uses setIdteckEmulatorID as a single
"is the firmware recent enough" sentinel. It does not specifically probe for
Jablotron, so a firmware that has IDTECK but predates Jablotron would pass the check
yet still not support Jablotron. This is left as-is on purpose: the check only drives
a global, non-blocking "please update firmware" banner, and bumping the sentinel to a
Jablotron command would show that banner to everyone still on a pre-Jablotron
firmware. That's better sequenced alongside a tagged firmware release that includes
Jablotron. Happy to add the sentinel bump if a maintainer prefers.

Testing

Verified on Android (1.3.0 (Build 4)):

  • Set the Jablotron emulator ID on a slot and read it back via the slot Edit
    dialog — round-trips correctly (hex + decimal card number).

Still to test:

  • Read/scan a real Jablotron tag on the Read Card page
  • Save a scanned Jablotron tag into the cards list; reopen and verify hex ID +
    decimal card number
  • Emulate a GUI-configured Jablotron slot against a real reader
  • Write a Jablotron ID to a T55xx tag from the GUI and read it back
  • Export a Jablotron slot to a saved card
  • Confirm the decimal card number matches a known physical tag
  • Desktop build sanity check (Linux / Windows / macOS)

midlan and others added 2 commits June 16, 2026 16:07
Threads the Jablotron LF tag through the GUI alongside the other LF
types. Jablotron is a 5-byte (40-bit) tag; its UID is shown both as hex
and as the decimal card number (BCD-derived).

- definitions.dart: scan/write/get/set-emu commands, TagType.jablotron,
  JablotronCard whose toViewableString() shows "<decimal> (<hex>)".
- bridge/chameleon.dart: readJablotron, get/setJablotronEmulatorID,
  writeJablotronToT55XX.
- general.dart: name, LF type list, getLFCardFromUID, 5-byte UID size,
  jablotronCardId() BCD helper.
- read_card.dart: added to the LF scan chain.
- write.dart + t55xx/write/base.dart: T55xx write with read-back verify.
- slot edit/export + slot_manager: emulator ID get/set for slots.
- test/jablotron_test.dart: BCD conversion, viewable string, round-trip.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
The slot edit dialog's save() dispatch was missing a Jablotron branch, so
editing a slot to Jablotron and entering a UID never called
setJablotronEmulatorID. The slot kept the factory-default id written by
setDefaultDataToSlot (01 B6 69 00 00), which is what reopening the dialog
then showed regardless of the entered value.

Co-Authored-By: Claude Fable 5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

1 participant